#include "stdio.h"
#include "stdlib.h"
// 栈
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define SElemType int
#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef int Status;

typedef struct 
{
	SElemType *base,*top;
	int stacksize;
}SqStack;

Status InitStack(SqStack &S);
Status GetTop(SqStack S,SElemType &e);
Status Push(SqStack &S,SElemType e);
Status Pop(SqStack &S,SElemType &e);
Status ShowStack(SqStack S);
Status conversion();
Status fuhao();

Status InitStack(SqStack &S){
	S.base = (SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
	if(!S.base)exit(OVERFLOW);
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}

Status GetTop(SqStack S,SElemType &e){
	if(S.base == S.top) return ERROR;
	e = *(S.top-1);
	return OK;
}

// 插入元素e为新的栈顶元素
Status Push(SqStack &S,SElemType e){
	if(S.base-S.top>=S.stacksize){
		S.base = (SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
		if(!S.base)exit(OVERFLOW);
		S.stacksize+=STACKINCREMENT;
	}
	*S.top++ = e;
	return OK;
}

// 取出栈顶元素并赋值给e
Status Pop(SqStack &S,SElemType &e){
	if(S.base==S.top) return ERROR;
	e = *--S.top;
	return OK;
}

Status ShowStack(SqStack S){
	if(S.base==S.top) return ERROR;
	while(S.base!=S.top) printf("%c",*--S.top);
	return OK;
}

Status StackEmpty(SqStack S){
	if(S.base==NULL)return OK;
	return ERROR;
}

// Status conversion(){
// 	SqStack S;
// 	int data,e;
// 	scanf("%d",&data);
// 	InitStack(S);
// 	while(data!=0){
// 		Push(S,data%8);
// 		data/=8;
// 	}
// 	while(!StackEmpty(S)){
// 		Pop(S,e);
// 		printf("%d\n", e);
// 	}
// 	return OK;
// }

// Status fuhao(){
// 	SqStack S;
// 	char c,top;
// 	InitStack(S);
// 	while(c!= '!')
// 	{
// 		scanf("%c",&c);
// 		getchar();
// 		if(c=='(' || c=='[' || c=='{'){
// 			Push(S,c);
// 		}else{
// 			if(StackEmpty(S))exit(ERROR);
// 			GetTop(S,top);
// 			switch(c){
// 				case ')':
// 					if(top!='(')exit(ERROR);break;
// 				case '}':
// 					if(top!='{')exit(ERROR);break;
// 				case ']':
// 					if(top!='[')exit(ERROR);break;
// 			}
// 			Pop(S,top);
// 		}
// 	}

// }

// Status command(){
// 	SqStack S;
// 	char c,temp;
// 	InitStack(S);
// 	while(c!='!'){
// 		scanf("%c",&c);
// 		getchar();
// 		if(c=='@'){S.base=NULL;S.top=S.base;continue;}
// 		if(c=='#'){Pop(S,temp);continue;}
// 		if(c=='!'){break;}
// 		Push(S,c);
// 	}
// 	ShowStack(S);
// 	return OK;
// }

Status test(){
	int i,data,temp;
	SqStack S;
	InitStack(S);
	scanf("%d",&i);
	while(i>0){
		scanf("%d",&data);
		if(S.base==S.top)
		{
			Push(S,data);
		}else{
			Pop(S,temp);
			if(temp>data){
				temp = data;
			}
			Push(S,temp);
		}
		i--;
	}
	Pop(S,data);
	printf("%d\n", data);
}


